WebGL ์ปดํจํธ ์ ฐ์ด๋๋ฅผ ํตํด ์น ๋ธ๋ผ์ฐ์ ์์ GPGPU ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ์ธ์. GPU ์ฑ๋ฅ์ ๋ฒ์ฉ ๊ณ์ฐ์ ํ์ฉํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํ๊ธฐ์ ์ผ๋ก ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
WebGL ์ปดํจํธ ์ ฐ์ด๋: ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํ GPGPU ์ฑ๋ฅ ๋ฐํ
์น ๋ธ๋ผ์ฐ์ ์์ ๋ฉ์ง ๊ทธ๋ํฝ์ ๋ ๋๋งํ๋ ๊ฒ์ผ๋ก ์ ํต์ ์ผ๋ก ์๋ ค์ง WebGL์ ๋จ์ํ ์๊ฐ์ ํํ์ ๋์ด ์งํํ์ต๋๋ค. WebGL 2์ ์ปดํจํธ ์ ฐ์ด๋๊ฐ ๋์ ๋๋ฉด์, ๊ฐ๋ฐ์๋ค์ ์ด์ ๊ทธ๋ํฝ ์ฒ๋ฆฌ ์ฅ์น(GPU)์ ๋ง๋ํ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ๋ฒ์ฉ ๊ณ์ฐ์ ํ์ฉํ ์ ์๊ฒ ๋์์ต๋๋ค. ์ด๋ GPGPU(General-Purpose computing on Graphics Processing Units)๋ก ์๋ ค์ง ๊ธฐ์ ์ ๋๋ค. ์ด๋ ์๋นํ ๊ณ์ฐ ์์์ ์๊ตฌํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ํํ ์ ์๋ ํฅ๋ฏธ๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค๋๋ค.
์ปดํจํธ ์ ฐ์ด๋๋ ๋ฌด์์ธ๊ฐ?
์ปดํจํธ ์ ฐ์ด๋๋ GPU์์ ์์์ ๊ณ์ฐ์ ์คํํ๋๋ก ์ค๊ณ๋ ํน์ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ๋๋ค. ๊ทธ๋ํฝ ํ์ดํ๋ผ์ธ์ ๋ฐ์ ํ๊ฒ ์ฐ๊ฒฐ๋ ๋ฒํ ์ค ์ ฐ์ด๋ ๋ฐ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์ ๋ฌ๋ฆฌ, ์ปดํจํธ ์ ฐ์ด๋๋ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํ๋ฏ๋ก ๋ณ๋ ฌ๋ก ์คํํ ์ ์๋ ๋ค์์ ์๊ณ ๋ ๋ฆฝ์ ์ธ ์์ ์ผ๋ก ๋๋ ์ ์๋ ํ์คํฌ์ ์ด์์ ์ ๋๋ค.
์ด๋ ๊ฒ ์๊ฐํด ๋ณด์ธ์: ๊ฑฐ๋ํ ์นด๋ ๋ฑ์ ์ ๋ ฌํ๋ค๊ณ ์์ํด ๋ด ์๋ค. ํ ์ฌ๋์ด ์ ์ฒด ๋ฑ์ ์์ฐจ์ ์ผ๋ก ์ ๋ ฌํ๋ ๋์ , ์ฌ๋ฌ ์ฌ๋์๊ฒ ์์ ๋ฌถ์์ ๋๋์ด ์ฃผ์ด ๋์์ ๊ฐ์์ ๋ฌถ์์ ์ ๋ ฌํ๊ฒ ํ ์ ์์ต๋๋ค. ์ปดํจํธ ์ ฐ์ด๋๋ ๋ฐ์ดํฐ์ ๋ํด ์ด์ ์ ์ฌํ ์์ ์ ์ํํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ์ต์ GPU์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ฐฑ ๋๋ ์์ฒ ๊ฐ์ ์ฝ์ด์ ๊ฑธ์ณ ์ฒ๋ฆฌ๋ฅผ ๋ถ์ฐ์ํต๋๋ค.
์ปดํจํธ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ๋ ์ด์
์ปดํจํธ ์ ฐ์ด๋ ์ฌ์ฉ์ ์ฃผ๋ ์ด์ ์ ์ฑ๋ฅ์ ๋๋ค. GPU๋ ๋ณธ์ง์ ์ผ๋ก ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์ ํน์ ์ ํ์ ์์ ์์๋ CPU๋ณด๋ค ํจ์ฌ ๋น ๋ฆ ๋๋ค. ์ฃผ์ ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋๊ท๋ชจ ๋ณ๋ ฌ์ฑ: GPU๋ ์๋ง์ ์ฝ์ด๋ฅผ ๋ณด์ ํ๊ณ ์์ด ์์ฒ ๊ฐ์ ์ค๋ ๋๋ฅผ ๋์์ ์คํํ ์ ์์ต๋๋ค. ์ด๋ ๋ง์ ๋ฐ์ดํฐ ์์์ ๋ํด ๋์ผํ ์์ ์ ์ํํด์ผ ํ๋ ๋ฐ์ดํฐ ๋ณ๋ ฌ ๊ณ์ฐ์ ์ด์์ ์ ๋๋ค.
- ๋์ ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ: GPU๋ ๋์ฉ๋ ๋ฐ์ดํฐ์ ์ ํจ์จ์ ์ผ๋ก ์ ๊ทผํ๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋์ ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค. ์ด๋ ๋น๋ฒํ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ด ํ์ํ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ ๊ฐ์ํ: ์ปดํจํธ ์ ฐ์ด๋๋ ์ด๋ฏธ์ง ์ฒ๋ฆฌ, ๊ณผํ ์๋ฎฌ๋ ์ด์ , ๋จธ์ ๋ฌ๋, ๊ธ์ต ๋ชจ๋ธ๋ง ๋ฑ ๋ค์ํ ๋ถ์ผ์ ์๊ณ ๋ฆฌ์ฆ์ ํฌ๊ฒ ๊ฐ์ํํ ์ ์์ต๋๋ค.
์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ์๋ฅผ ์๊ฐํด ๋ด ์๋ค. ์ด๋ฏธ์ง์ ํํฐ๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ๊ฐ ํฝ์ ์ ๋ํด ์ํ์ ์ฐ์ฐ์ ์ํํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. CPU๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ ์์ฐจ์ ์ผ๋ก, ํ ๋ฒ์ ํ ํฝ์ ์ฉ(๋๋ ์ ํ๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ฌ๋ฌ CPU ์ฝ์ด๋ฅผ ์ฌ์ฉํ์ฌ) ์ํ๋ฉ๋๋ค. ์ปดํจํธ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ํฝ์ ์ด GPU์ ๊ฐ๋ณ ์ค๋ ๋์ ์ํด ์ฒ๋ฆฌ๋ ์ ์์ด ๊ทน์ ์ธ ์๋ ํฅ์์ ๊ฐ์ ธ์ต๋๋ค.
์ปดํจํธ ์ ฐ์ด๋์ ์๋ ๋ฐฉ์: ๊ฐ๋ตํ ๊ฐ์
์ปดํจํธ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐ๋ ๋ช ๊ฐ์ง ์ฃผ์ ๋จ๊ณ๊ฐ ํฌํจ๋ฉ๋๋ค:
- ์ปดํจํธ ์ ฐ์ด๋ ์์ฑ (GLSL): ์ปดํจํธ ์ ฐ์ด๋๋ ๋ฒํ ์ค ์ ฐ์ด๋ ๋ฐ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์ ์ฌ์ฉ๋๋ ๊ฒ๊ณผ ๋์ผํ ์ธ์ด์ธ GLSL(OpenGL Shading Language)๋ก ์์ฑ๋ฉ๋๋ค. ์ ฐ์ด๋ ๋ด์์ ๋ณ๋ ฌ๋ก ์คํํ๋ ค๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ ๋ ฅ ๋ฐ์ดํฐ(์: ํ ์ค์ฒ, ๋ฒํผ), ์ถ๋ ฅ ๋ฐ์ดํฐ(์: ํ ์ค์ฒ, ๋ฒํผ) ๋ฐ ๊ฐ ๋ฐ์ดํฐ ์์๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ก์ง์ ์ง์ ํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
- WebGL ์ปดํจํธ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ ์์ฑ: ๋ฒํ ์ค ๋ฐ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์ฉ ํ๋ก๊ทธ๋จ์ ๋ง๋๋ ๊ฒ๊ณผ ์ ์ฌํ๊ฒ, ์ปดํจํธ ์ ฐ์ด๋ ์์ค ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ณ WebGL ํ๋ก๊ทธ๋จ ๊ฐ์ฒด์ ๋งํฌํฉ๋๋ค.
- ๋ฒํผ/ํ ์ค์ฒ ์์ฑ ๋ฐ ๋ฐ์ธ๋ฉ: GPU์ ๋ฒํผ๋ ํ ์ค์ฒ ํํ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ์ฌ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด๋ฌํ ๋ฒํผ/ํ ์ค์ฒ๋ฅผ ์ปดํจํธ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ๋ฐ์ธ๋ฉํ์ฌ ์ ฐ์ด๋ ๋ด์์ ์ ๊ทผํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ปดํจํธ ์
ฐ์ด๋ ๋์คํจ์น:
gl.dispatchCompute()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํจํธ ์ ฐ์ด๋๋ฅผ ์คํํฉ๋๋ค. ์ด ํจ์๋ ์คํํ๋ ค๋ ์์ ๊ทธ๋ฃน์ ์๋ฅผ ์ง์ ํ์ฌ ๋ณ๋ ฌ ์ฒ๋ฆฌ ์์ค์ ํจ๊ณผ์ ์ผ๋ก ์ ์ํฉ๋๋ค. - ๊ฒฐ๊ณผ ๋ค์ ์ฝ๊ธฐ (์ ํ ์ฌํญ): ์ปดํจํธ ์ ฐ์ด๋ ์คํ์ด ์๋ฃ๋ ํ, ์ ํ์ ์ผ๋ก ์ถ๋ ฅ ๋ฒํผ/ํ ์ค์ฒ์์ CPU๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ฝ์ด์ ์ถ๊ฐ ์ฒ๋ฆฌํ๊ฑฐ๋ ํ์ํ ์ ์์ต๋๋ค.
๊ฐ๋จํ ์์ : ๋ฒกํฐ ๋ง์
์ปดํจํธ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ฒกํฐ๋ฅผ ๋ํ๋ ๊ฐ๋จํ ์์ ๋ก ๊ฐ๋ ์ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ์์ ๋ ํต์ฌ ๊ฐ๋ ์ ์ง์คํ๊ธฐ ์ํด ์๋์ ์ผ๋ก ๋จ์ํ๊ฒ ๋ง๋ค์์ต๋๋ค.
์ปดํจํธ ์ ฐ์ด๋ (vector_add.glsl):
#version 310 es
layout (local_size_x = 64) in;
layout (std430, binding = 0) buffer InputA {
float a[];
};
layout (std430, binding = 1) buffer InputB {
float b[];
};
layout (std430, binding = 2) buffer Output {
float result[];
};
void main() {
uint index = gl_GlobalInvocationID.x;
result[index] = a[index] + b[index];
}
์ค๋ช :
#version 310 es: GLSL ES 3.1 ๋ฒ์ (WebGL 2)์ ์ง์ ํฉ๋๋ค.layout (local_size_x = 64) in;: ์ํฌ๊ทธ๋ฃน ํฌ๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค. ๊ฐ ์ํฌ๊ทธ๋ฃน์ 64๊ฐ์ ์ค๋ ๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.layout (std430, binding = 0) buffer InputA { ... };: ๋ฐ์ธ๋ฉ ํฌ์ธํธ 0์ ๋ฐ์ธ๋ฉ๋InputA๋ผ๋ ์ด๋ฆ์ ์ ฐ์ด๋ ์ ์ฅ ๋ฒํผ ๊ฐ์ฒด(SSBO)๋ฅผ ์ ์ธํฉ๋๋ค. ์ด ๋ฒํผ์๋ ์ฒซ ๋ฒ์งธ ์ ๋ ฅ ๋ฒกํฐ๊ฐ ํฌํจ๋ฉ๋๋ค.std430๋ ์ด์์์ ํ๋ซํผ ๊ฐ ์ผ๊ด๋ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ ๋ณด์ฅํฉ๋๋ค.layout (std430, binding = 1) buffer InputB { ... };: ๋ ๋ฒ์งธ ์ ๋ ฅ ๋ฒกํฐ(InputB)์ ๋ํด ๋ฐ์ธ๋ฉ ํฌ์ธํธ 1์ ๋ฐ์ธ๋ฉ๋ ์ ์ฌํ SSBO๋ฅผ ์ ์ธํฉ๋๋ค.layout (std430, binding = 2) buffer Output { ... };: ์ถ๋ ฅ ๋ฒกํฐ(result)์ ๋ํด ๋ฐ์ธ๋ฉ ํฌ์ธํธ 2์ ๋ฐ์ธ๋ฉ๋ SSBO๋ฅผ ์ ์ธํฉ๋๋ค.uint index = gl_GlobalInvocationID.x;: ํ์ฌ ์คํ ์ค์ธ ์ค๋ ๋์ ์ ์ญ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ์ด ์ธ๋ฑ์ค๋ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ๋ฒกํฐ์์ ์ฌ๋ฐ๋ฅธ ์์์ ์ ๊ทผํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.result[index] = a[index] + b[index];: ๋ฒกํฐ ๋ง์ ์ ์ํํ์ฌa์b์ ํด๋น ์์๋ฅผ ๋ํ๊ณ ๊ฒฐ๊ณผ๋ฅผresult์ ์ ์ฅํฉ๋๋ค.
JavaScript ์ฝ๋ (๊ฐ๋ ์ ):
// 1. WebGL ์ปจํ
์คํธ ์์ฑ (canvas ์์๊ฐ ์๋ค๊ณ ๊ฐ์ )
const canvas = document.getElementById('myCanvas');
const gl = canvas.getContext('webgl2');
// 2. ์ปดํจํธ ์
ฐ์ด๋ ๋ก๋ ๋ฐ ์ปดํ์ผ (vector_add.glsl)
const computeShaderSource = await loadShaderSource('vector_add.glsl'); // ์
ฐ์ด๋ ์์ค๋ฅผ ๋ก๋ํ๋ ํจ์๊ฐ ์๋ค๊ณ ๊ฐ์
const computeShader = gl.createShader(gl.COMPUTE_SHADER);
gl.shaderSource(computeShader, computeShaderSource);
gl.compileShader(computeShader);
// ์ค๋ฅ ๊ฒ์ฌ (๊ฐ๊ฒฐ์ฑ์ ์ํด ์๋ต)
// 3. ํ๋ก๊ทธ๋จ ์์ฑ ๋ฐ ์ปดํจํธ ์
ฐ์ด๋ ์ฐ๊ฒฐ
const computeProgram = gl.createProgram();
gl.attachShader(computeProgram, computeShader);
gl.linkProgram(computeProgram);
gl.useProgram(computeProgram);
// 4. ๋ฒํผ ์์ฑ ๋ฐ ๋ฐ์ธ๋ฉ (SSBO)
const vectorSize = 1024; // ์์ ๋ฒกํฐ ํฌ๊ธฐ
const inputA = new Float32Array(vectorSize);
const inputB = new Float32Array(vectorSize);
const output = new Float32Array(vectorSize);
// inputA์ inputB์ ๋ฐ์ดํฐ ์ฑ์ฐ๊ธฐ (๊ฐ๊ฒฐ์ฑ์ ์ํด ์๋ต)
const bufferA = gl.createBuffer();
gl.bindBuffer(gl.SHADER_STORAGE_BUFFER, bufferA);
gl.bufferData(gl.SHADER_STORAGE_BUFFER, inputA, gl.STATIC_DRAW);
gl.bindBufferBase(gl.SHADER_STORAGE_BUFFER, 0, bufferA); // ๋ฐ์ธ๋ฉ ํฌ์ธํธ 0์ ๋ฐ์ธ๋ฉ
const bufferB = gl.createBuffer();
gl.bindBuffer(gl.SHADER_STORAGE_BUFFER, bufferB);
gl.bufferData(gl.SHADER_STORAGE_BUFFER, inputB, gl.STATIC_DRAW);
gl.bindBufferBase(gl.SHADER_STORAGE_BUFFER, 1, bufferB); // ๋ฐ์ธ๋ฉ ํฌ์ธํธ 1์ ๋ฐ์ธ๋ฉ
const bufferOutput = gl.createBuffer();
gl.bindBuffer(gl.SHADER_STORAGE_BUFFER, bufferOutput);
gl.bufferData(gl.SHADER_STORAGE_BUFFER, output, gl.STATIC_DRAW);
gl.bindBufferBase(gl.SHADER_STORAGE_BUFFER, 2, bufferOutput); // ๋ฐ์ธ๋ฉ ํฌ์ธํธ 2์ ๋ฐ์ธ๋ฉ
// 5. ์ปดํจํธ ์
ฐ์ด๋ ์คํ
const workgroupSize = 64; // ์
ฐ์ด๋์ local_size_x์ ์ผ์นํด์ผ ํจ
const numWorkgroups = Math.ceil(vectorSize / workgroupSize);
gl.dispatchCompute(numWorkgroups, 1, 1);
// 6. ๋ฉ๋ชจ๋ฆฌ ์ฅ๋ฒฝ (๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ธฐ ์ ์ ์ปดํจํธ ์
ฐ์ด๋๊ฐ ์๋ฃ๋๋๋ก ๋ณด์ฅ)
gl.memoryBarrier(gl.SHADER_STORAGE_BARRIER_BIT);
// 7. ๊ฒฐ๊ณผ ๋ค์ ์ฝ๊ธฐ
gl.bindBuffer(gl.SHADER_STORAGE_BUFFER, bufferOutput);
gl.getBufferSubData(gl.SHADER_STORAGE_BUFFER, 0, output);
// 'output'์ ์ด์ ๋ฒกํฐ ๋ง์
์ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํจ
console.log(output);
์ค๋ช :
- JavaScript ์ฝ๋๋ ๋จผ์ WebGL2 ์ปจํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค.
- ๊ทธ๋ฐ ๋ค์ ์ปดํจํธ ์ ฐ์ด๋ ์ฝ๋๋ฅผ ๋ก๋ํ๊ณ ์ปดํ์ผํฉ๋๋ค.
- ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ๋ฒกํฐ๋ฅผ ๋ด์ ๋ฒํผ(SSBO)๊ฐ ์์ฑ๋ฉ๋๋ค. ์ ๋ ฅ ๋ฒกํฐ์ ๋ํ ๋ฐ์ดํฐ๊ฐ ์ฑ์์ง๋๋ค(์ด ๋จ๊ณ๋ ๊ฐ๊ฒฐ์ฑ์ ์ํด ์๋ต๋จ).
gl.dispatchCompute()ํจ์๋ ์ปดํจํธ ์ ฐ์ด๋๋ฅผ ์คํํฉ๋๋ค. ์ํฌ๊ทธ๋ฃน์ ์๋ ๋ฒกํฐ ํฌ๊ธฐ์ ์ ฐ์ด๋์ ์ ์๋ ์ํฌ๊ทธ๋ฃน ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ณ์ฐ๋ฉ๋๋ค.gl.memoryBarrier()๋ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ฝ๊ธฐ ์ ์ ์ปดํจํธ ์ ฐ์ด๋๊ฐ ์คํ์ ์๋ฃํ์์ ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๊ฒฝ์ ์กฐ๊ฑด์ ํผํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.- ๋ง์ง๋ง์ผ๋ก,
gl.getBufferSubData()๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ ฅ ๋ฒํผ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ฝ์ต๋๋ค.
์ด๊ฒ์ ๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ ์์ ์ด์ง๋ง WebGL์์ ์ปดํจํธ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ๋ ํต์ฌ ์์น์ ๋ณด์ฌ์ค๋๋ค. ํต์ฌ์ GPU๊ฐ ๋ฒกํฐ ๋ง์ ์ ๋ณ๋ ฌ๋ก ์ํํ์ฌ ๋๊ท๋ชจ ๋ฒกํฐ์ ๋ํด CPU ๊ธฐ๋ฐ ๊ตฌํ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๋ค๋ ๊ฒ์ ๋๋ค.
WebGL ์ปดํจํธ ์ ฐ์ด๋์ ์ค์ ์ ์ฉ ์ฌ๋ก
์ปดํจํธ ์ ฐ์ด๋๋ ๋ค์ํ ๋ฌธ์ ์ ์ ์ฉ๋ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์ฃผ๋ชฉํ ๋งํ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ด๋ฏธ์ง ์ฒ๋ฆฌ: ํํฐ ์ ์ฉ, ์ด๋ฏธ์ง ๋ถ์ ์ํ ๋ฐ ๊ณ ๊ธ ์ด๋ฏธ์ง ์กฐ์ ๊ธฐ์ ๊ตฌํ. ์๋ฅผ ๋ค์ด, ๋ธ๋ฌ๋ง, ์คํ๋, ์ฃ์ง ๊ฐ์ง ๋ฐ ์์ ๋ณด์ ์ ์๋นํ ๊ฐ์ํ๋ ์ ์์ต๋๋ค. ์ปดํจํธ ์ ฐ์ด๋์ ํ ๋๋ถ์ ๋ณต์กํ ํํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ์ฉํ ์ ์๋ ์น ๊ธฐ๋ฐ ์ฌ์ง ํธ์ง๊ธฐ๋ฅผ ์์ํด ๋ณด์ธ์.
- ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ : ์ ์ ์์คํ , ์ ์ฒด ์ญํ ๋ฐ ๊ธฐํ ๋ฌผ๋ฆฌ ๊ธฐ๋ฐ ํ์ ์๋ฎฌ๋ ์ด์ . ์ด๋ ํ์ค์ ์ธ ์ ๋๋ฉ์ด์ ๊ณผ ์ธํฐ๋ํฐ๋ธ ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค. ์ปดํจํธ ์ ฐ์ด๋ ๊ธฐ๋ฐ ์ ์ฒด ์๋ฎฌ๋ ์ด์ ๋๋ถ์ ๋ฌผ์ด ํ์ค์ ์ผ๋ก ํ๋ฅด๋ ์น ๊ธฐ๋ฐ ๊ฒ์์ ์๊ฐํด ๋ณด์ธ์.
- ๋จธ์ ๋ฌ๋: ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ, ํนํ ์ฌ์ธต ์ ๊ฒฝ๋ง์ ํ๋ จ ๋ฐ ๋ฐฐํฌ. GPU๋ ํ๋ ฌ ๊ณฑ์ ๋ฐ ๊ธฐํ ์ ํ ๋์ ์ฐ์ฐ์ ํจ์จ์ ์ผ๋ก ์ํํ๋ ๋ฅ๋ ฅ ๋๋ฌธ์ ๋จธ์ ๋ฌ๋์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ์น ๊ธฐ๋ฐ ๋จธ์ ๋ฌ๋ ๋ฐ๋ชจ๋ ์ปดํจํธ ์ ฐ์ด๋๊ฐ ์ ๊ณตํ๋ ํฅ์๋ ์๋์ ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค.
- ๊ณผํ ์ปดํจํ : ์์น ์๋ฎฌ๋ ์ด์ , ๋ฐ์ดํฐ ๋ถ์ ๋ฐ ๊ธฐํ ๊ณผํ ๊ณ์ฐ ์ํ. ์ฌ๊ธฐ์๋ ๊ณ์ฐ ์ ์ฒด ์ญํ(CFD), ๋ถ์ ์ญํ, ๊ธฐํ ๋ชจ๋ธ๋ง๊ณผ ๊ฐ์ ๋ถ์ผ๊ฐ ํฌํจ๋ฉ๋๋ค. ์ฐ๊ตฌ์๋ค์ ์ปดํจํธ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ์๊ฐํํ๊ณ ๋ถ์ํ๋ ์น ๊ธฐ๋ฐ ๋๊ตฌ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
- ๊ธ์ต ๋ชจ๋ธ๋ง: ์ต์ ๊ฐ๊ฒฉ ์ฑ ์ ๋ฐ ์ํ ๊ด๋ฆฌ์ ๊ฐ์ ๊ธ์ต ๊ณ์ฐ ๊ฐ์ํ. ๊ณ์ฐ ์ง์ฝ์ ์ธ ๋ชฌํ ์นด๋ฅผ๋ก ์๋ฎฌ๋ ์ด์ ์ ์ปดํจํธ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ์ฌ ํฌ๊ฒ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค. ๊ธ์ต ๋ถ์๊ฐ๋ค์ ์ปดํจํธ ์ ฐ์ด๋ ๋๋ถ์ ์ค์๊ฐ ์ํ ๋ถ์์ ์ ๊ณตํ๋ ์น ๊ธฐ๋ฐ ๋์๋ณด๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ ์ด ํธ๋ ์ด์ฑ: ์ ํต์ ์ผ๋ก ์ ์ฉ ๋ ์ด ํธ๋ ์ด์ฑ ํ๋์จ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋์์ง๋ง, ๋ ๊ฐ๋จํ ๋ ์ด ํธ๋ ์ด์ฑ ์๊ณ ๋ฆฌ์ฆ์ ์ปดํจํธ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ์ฌ ์น ๋ธ๋ผ์ฐ์ ์์ ์ธํฐ๋ํฐ๋ธ ๋ ๋๋ง ์๋๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
ํจ์จ์ ์ธ ์ปดํจํธ ์ ฐ์ด๋ ์์ฑ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ปดํจํธ ์ ฐ์ด๋์ ์ฑ๋ฅ ์ด์ ์ ๊ทน๋ํํ๋ ค๋ฉด ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ๋ณ๋ ฌ์ฑ ๊ทน๋ํ: GPU์ ๊ณ ์ ํ ๋ณ๋ ฌ์ฑ์ ํ์ฉํ๋๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ค๊ณํ์ญ์์ค. ์์ ์ ๋์์ ์คํํ ์ ์๋ ์๊ณ ๋ ๋ฆฝ์ ์ธ ์์ ์ผ๋ก ๋ถํดํ์ญ์์ค.
- ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์ต์ ํ: ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ต์ํํ๊ณ ๋ฐ์ดํฐ ์ง์ญ์ฑ์ ๊ทน๋ํํ์ญ์์ค. ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ฐ์ ๊ณ์ฐ์ ๋นํด ์๋์ ์ผ๋ก ๋๋ฆฐ ์์ ์ ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฅํ ํ GPU ์บ์์ ์ ์งํ๋ ค๊ณ ๋ ธ๋ ฅํ์ญ์์ค.
- ๊ณต์ ๋ก์ปฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ: ์ํฌ๊ทธ๋ฃน ๋ด์์ ์ค๋ ๋๋ ๊ณต์ ๋ก์ปฌ ๋ฉ๋ชจ๋ฆฌ(GLSL์
sharedํค์๋)๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ์ด๋ ์ ์ญ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฆ ๋๋ค. ์ ์ญ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํ์๋ฅผ ์ค์ด๊ธฐ ์ํด ๊ณต์ ๋ก์ปฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ญ์์ค. - ๋ถ๊ธฐ ์ต์ํ: ๋ถ๊ธฐ๋ ์ํฌ๊ทธ๋ฃน ๋ด์ ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์คํ ๊ฒฝ๋ก๋ฅผ ํํ ๋(์: ์กฐ๊ฑด๋ฌธ์ผ๋ก ์ธํด) ๋ฐ์ํฉ๋๋ค. ๋ถ๊ธฐ๋ ์ฑ๋ฅ์ ํฌ๊ฒ ์ ํ์ํฌ ์ ์์ต๋๋ค. ๋ถ๊ธฐ๋ฅผ ์ต์ํํ๋ ์ฝ๋๋ฅผ ์์ฑํ์ญ์์ค.
- ์ ์ ํ ์ํฌ๊ทธ๋ฃน ํฌ๊ธฐ ์ ํ: ์ํฌ๊ทธ๋ฃน ํฌ๊ธฐ(
local_size_x,local_size_y,local_size_z)๋ ๊ทธ๋ฃน์ผ๋ก ํจ๊ป ์คํ๋๋ ์ค๋ ๋์ ์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ฌ๋ฐ๋ฅธ ์ํฌ๊ทธ๋ฃน ํฌ๊ธฐ๋ฅผ ์ ํํ๋ฉด ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ํน์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ํ๋์จ์ด์ ์ต์ ์ ๊ฐ์ ์ฐพ๊ธฐ ์ํด ๋ค์ํ ์ํฌ๊ทธ๋ฃน ํฌ๊ธฐ๋ก ์คํํด ๋ณด์ญ์์ค. ์ผ๋ฐ์ ์ธ ์์์ ์ GPU์ ์ํ ํฌ๊ธฐ(์ผ๋ฐ์ ์ผ๋ก 32 ๋๋ 64)์ ๋ฐฐ์์ธ ์ํฌ๊ทธ๋ฃน ํฌ๊ธฐ์ ๋๋ค. - ์ ์ ํ ๋ฐ์ดํฐ ์ ํ ์ฌ์ฉ: ๊ณ์ฐ์ ์ถฉ๋ถํ ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ ์ ํ์ ์ฌ์ฉํ์ญ์์ค. ์๋ฅผ ๋ค์ด, 32๋นํธ ๋ถ๋ ์์์ ์ซ์์ ์ ์ฒด ์ ๋ฐ๋๊ฐ ํ์ํ์ง ์์ ๊ฒฝ์ฐ 16๋นํธ ๋ถ๋ ์์์ ์ซ์(GLSL์
half) ์ฌ์ฉ์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. - ํ๋กํ์ผ๋ง ๋ฐ ์ต์ ํ: ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํจํธ ์ ฐ์ด๋์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ญ์์ค. ๋ค์ํ ์ต์ ํ ๊ธฐ์ ์ ์คํํ๊ณ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ธก์ ํ์ญ์์ค.
๊ณผ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
์ปดํจํธ ์ ฐ์ด๋๋ ์๋นํ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ์ผ๋์ ๋์ด์ผ ํ ๋ช ๊ฐ์ง ๊ณผ์ ์ ๊ณ ๋ ค ์ฌํญ๋ ์์ต๋๋ค:
- ๋ณต์ก์ฑ: ํจ์จ์ ์ธ ์ปดํจํธ ์ ฐ์ด๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ผ๋ฉฐ, GPU ์ํคํ ์ฒ์ ๋ณ๋ ฌ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์ ๋ํ ์ข์ ์ดํด๊ฐ ํ์ํฉ๋๋ค.
- ๋๋ฒ๊น : ๋ณ๋ ฌ ์ฝ๋์์ ์ค๋ฅ๋ฅผ ์ถ์ ํ๊ธฐ ์ด๋ ค์ธ ์ ์์ผ๋ฏ๋ก ์ปดํจํธ ์ ฐ์ด๋ ๋๋ฒ๊น ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ข ์ข ์ ๋ฌธ ๋๋ฒ๊น ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค.
- ์ด์์ฑ: WebGL์ ํฌ๋ก์ค ํ๋ซํผ์ ์ํด ์ค๊ณ๋์์ง๋ง, ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ GPU ํ๋์จ์ด ๋ฐ ๋๋ผ์ด๋ฒ ๊ตฌํ์ ์ฐจ์ด๊ฐ ์ฌ์ ํ ์์ ์ ์์ต๋๋ค. ์ผ๊ด๋ ์ฑ๋ฅ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ค๋ฅธ ํ๋ซํผ์์ ์ปดํจํธ ์ ฐ์ด๋๋ฅผ ํ ์คํธํ์ญ์์ค.
- ๋ณด์: ์ปดํจํธ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ ๋ ๋ณด์ ์ทจ์ฝ์ ์ ์ ์ํ์ญ์์ค. ์ ์ฑ ์ฝ๋๊ฐ ์ ฐ์ด๋์ ์ฃผ์ ๋์ด ์์คํ ์ ์์์ํฌ ์ ์์ต๋๋ค. ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ ์คํ๊ฒ ๊ฒ์ฆํ๊ณ ์ ๋ขฐํ ์ ์๋ ์ฝ๋๋ฅผ ์คํํ์ง ๋ง์ญ์์ค.
- Web Assembly (WASM) ํตํฉ: ์ปดํจํธ ์ ฐ์ด๋๋ ๊ฐ๋ ฅํ์ง๋ง GLSL๋ก ์์ฑ๋ฉ๋๋ค. WASM์ ํตํด C++๊ณผ ๊ฐ์ ์น ๊ฐ๋ฐ์์ ์์ฃผ ์ฌ์ฉ๋๋ ๋ค๋ฅธ ์ธ์ด์ ํตํฉํ๋ ๊ฒ์ ๋ณต์กํ ์ ์์ต๋๋ค. WASM๊ณผ ์ปดํจํธ ์ ฐ์ด๋ ๊ฐ์ ๊ฒฉ์ฐจ๋ฅผ ๋ฉ์ฐ๋ ค๋ฉด ์ ์คํ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ฐ ๋๊ธฐํ๊ฐ ํ์ํฉ๋๋ค.
WebGL ์ปดํจํธ ์ ฐ์ด๋์ ๋ฏธ๋
WebGL ์ปดํจํธ ์ ฐ์ด๋๋ ์น ๊ฐ๋ฐ์์ ์ค์ํ ์ง์ ์ ๋ํ๋ด๋ฉฐ, GPGPU ํ๋ก๊ทธ๋๋ฐ์ ํ์ ์น ๋ธ๋ผ์ฐ์ ์ ๊ฐ์ ธ์ต๋๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ ๋ ๋ณต์กํด์ง๊ณ ์๊ตฌ ์ฌํญ์ด ๋ง์์ง์ ๋ฐ๋ผ ์ปดํจํธ ์ ฐ์ด๋๋ ์ฑ๋ฅ์ ๊ฐ์ํํ๊ณ ์๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ฌ๋ ๋ฐ ์ ์ ๋ ์ค์ํ ์ญํ ์ ํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ปดํจํธ ์ ฐ์ด๋ ๊ธฐ์ ์์ ๋ค์๊ณผ ๊ฐ์ ์ถ๊ฐ์ ์ธ ๋ฐ์ ์ ๊ธฐ๋ํ ์ ์์ต๋๋ค:
- ๊ฐ์ ๋ ๋๊ตฌ: ๋ ๋์ ๋๋ฒ๊น ๋ฐ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ ์ปดํจํธ ์ ฐ์ด๋ ๊ฐ๋ฐ ๋ฐ ์ต์ ํ๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋ค ๊ฒ์ ๋๋ค.
- ํ์คํ: ์ปดํจํธ ์ ฐ์ด๋ API์ ์ถ๊ฐ ํ์คํ๋ ์ด์์ฑ์ ํฅ์์ํค๊ณ ํ๋ซํผ๋ณ ์ฝ๋์ ํ์์ฑ์ ์ค์ผ ๊ฒ์ ๋๋ค.
- ๋จธ์ ๋ฌ๋ ํ๋ ์์ํฌ์์ ํตํฉ: ๋จธ์ ๋ฌ๋ ํ๋ ์์ํฌ์์ ์ํํ ํตํฉ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๋ ์ฝ๊ฒ ๋ฐฐํฌํ ์ ์๊ฒ ํ ๊ฒ์ ๋๋ค.
- ์ฑํ ์ฆ๊ฐ: ๋ ๋ง์ ๊ฐ๋ฐ์๊ฐ ์ปดํจํธ ์ ฐ์ด๋์ ์ด์ ์ ์ธ์ํจ์ ๋ฐ๋ผ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฑํ์ด ์ฆ๊ฐํ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค.
- WebGPU: WebGPU๋ WebGL์ ๋ํ ๋ ํ๋์ ์ด๊ณ ํจ์จ์ ์ธ ๋์์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ์๋ก์ด ์น ๊ทธ๋ํฝ API์ ๋๋ค. WebGPU๋ ๋ํ ์ปดํจํธ ์ ฐ์ด๋๋ฅผ ์ง์ํ์ฌ ์ ์ฌ์ ์ผ๋ก ๋ ๋์ ์ฑ๋ฅ๊ณผ ์ ์ฐ์ฑ์ ์ ๊ณตํ ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก
WebGL ์ปดํจํธ ์ ฐ์ด๋๋ ์น ๋ธ๋ผ์ฐ์ ๋ด์์ GPU์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ๋ฐํํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์ปดํจํธ ์ ฐ์ด๋๋ฅผ ํ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ๊ฐ์ํํ๊ณ , ์น ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฅ์์ํค๋ฉฐ, ์๋กญ๊ณ ํ์ ์ ์ธ ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทน๋ณตํด์ผ ํ ๊ณผ์ ๊ฐ ์์ง๋ง, ์ ์ฌ์ ์ธ ์ด์ ์ ์๋นํ๋ฉฐ, ์ปดํจํธ ์ ฐ์ด๋๋ ์น ๊ฐ๋ฐ์๋ค์ด ํ์ํ ํฅ๋ฏธ๋ก์ด ๋ถ์ผ์ ๋๋ค.
์น ๊ธฐ๋ฐ ์ด๋ฏธ์ง ํธ์ง๊ธฐ, ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ , ๋จธ์ ๋ฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ์๋นํ ๊ณ์ฐ ์์์ ์๊ตฌํ๋ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ณ ์๋ค๋ฉด WebGL ์ปดํจํธ ์ ฐ์ด๋์ ํ์ ํ์ํด ๋ณด์ญ์์ค. GPU์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ํ์ฉํ๋ ๋ฅ๋ ฅ์ ์ฑ๋ฅ์ ๊ทน์ ์ผ๋ก ํฅ์์ํค๊ณ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ปดํจํธ ์ ฐ์ด๋์ ์ต์์ ์ฌ์ฉ์ ํญ์ ์์ํ ์๋์ ๊ดํ ๊ฒ์ด ์๋๋ผ๋ ์ ์ ๊ธฐ์ตํ์ญ์์ค. ์ด๋ ์์ ์ *์ ํฉํ* ๋๊ตฌ๋ฅผ ์ฐพ๋ ๊ฒ์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ ์คํ๊ฒ ๋ถ์ํ๊ณ ์ปดํจํธ ์ ฐ์ด๋์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ด ์๋นํ ์ด์ ์ ์ ๊ณตํ ์ ์๋์ง ํ๋จํ์ญ์์ค. ํน์ ์๊ตฌ์ ๋ง๋ ์ต์ ์ ์๋ฃจ์ ์ ์ฐพ๊ธฐ ์ํด ์คํํ๊ณ , ํ๋กํ์ผ๋งํ๊ณ , ๋ฐ๋ณตํ์ญ์์ค.